home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 41.zip / BS1 part 41 / Amiga Plus 1.adf / Programming / ExecPrt.asm < prev    next >
Assembly Source File  |  1978-04-08  |  9KB  |  243 lines

  1. ;EXECPRT.ASM 12/09/88
  2. ;COPYRIGHT 1988 BY DANIEL WOLF PH.D.
  3. ;EXEC I/O EXAMPLE FOR PRINTER OUTPUT
  4. ;USES DEVICE-BASED I/O WITH IOBLOCK AND REPLY MSGPORT
  5.  
  6. SIZE.STDIO     EQU $30
  7. SIZE.MP        EQU $22
  8. CMD_WRITE      EQU $3
  9.  
  10. LVO.ALLOCMEM   EQU $FFFFFF3A
  11. LVO.ADDPORT    EQU $FFFFFE9E
  12. LVO.FINDTASK   EQU $FFFFFEDA
  13. LVO.FREEMEM    EQU $FFFFFF2E
  14. LVO.GETMSG     EQU $FFFFFE8C
  15. LVO.WAITPORT   EQU $FFFFFE80
  16. LVO.DOIO       EQU $FFFFFE38
  17. LVO.CHECKIO    EQU $FFFFFE2C
  18. LVO.ABORTIO    EQU $FFFFFE20
  19. LVO.SENDIO     EQU $FFFFFE32
  20. LVO.WAITIO     EQU $FFFFFE26
  21. LVO.OPENDEVICE EQU $FFFFFE44
  22. LVO.FREESIGNAL EQU $FFFFFEB0
  23. LVO.CLOSEDEVICE EQU $FFFFFE3E
  24. LVO.ALLOCSIGNAL EQU $FFFFFEB6
  25.  
  26. IO.COMMAND     EQU $1C
  27. IO.DEVICE      EQU $14
  28. IO.DATA        EQU $28
  29. IO.LENGTH      EQU $24
  30. LIST.HEAD      EQU $0
  31. LIST.TAIL      EQU $4
  32. MEMF_PUBLIC    EQU $0
  33. MEMF_CLEAR     EQU $10000
  34. MP.MSGLIST     EQU $14
  35. MP.SIGTASK     EQU $10
  36. MP.SIGBIT      EQU $F
  37. MP.FLAGS       EQU $E
  38. MSG.REPLYPORT  EQU $E
  39. NODE.PRED      EQU $4
  40. NODE.NAME      EQU $A
  41. NODE.TYPE      EQU $8
  42. NODE.PRI       EQU $9
  43. NT_MSGPORT     EQU $4
  44. NT_MESSAGE     EQU $5
  45. PA_SIGNAL      EQU $0
  46.  
  47. MAIN
  48.  BSR OPENPRINTER        ;SET UP REPLY MSGPORT, SIGBIT, IOBLOCK THEN OPEN IT
  49.  TST.L D0               ;IF PRINTER OPENING FAILED THEN
  50.  BNE ERROR              ; BRANCH OUT OF HERE
  51.  
  52.  MOVE.L IOREQ,A1        ;ELSE SET UP POINTERS TO IOBLOCK AND ASCII TEXT
  53.  LEA IOTEXT,A0
  54.  BSR PRINTERWRITE       ;CALL PRINTER OUTPUT ROUTINE
  55.  
  56. ; MOVE.L #18000,D0      ;A VERY DUMB DELAY LOOP TO WASTE SOME TIME
  57. ;LOOP                   ;IF YOU CHANGE PRINTERWRITE TO USE SENDIO.
  58. ; MOVE.L A0,-(SP)       ;DOIO DOESN'T NEED THIS BECAUSE IT WAITS TIL I/O DONE.
  59. ; MOVE.L (SP)+,A0       ;WITHOUT THIS DELAY, ABORTIO (IN CLOSEPRINTER)
  60. ; DBRA D0,LOOP          ;HAPPENS IMMEDIATELY  - TOO FAST FOR SENDIO TO FINISH
  61.  
  62.  BSR CLOSEPRINTER       ;FREE ALL RESOURCES ASSOCIATED WITH PRINTER DEVICE
  63.  
  64.  MOVEQ #0,D0
  65. ERROR                   ;AND WAVE GOODBYE
  66.  RTS
  67.  
  68. ;**************** APPROPRIATE EXEC AND I/O MACROS
  69.  
  70. NEWLIST MACRO     ;An
  71.  MOVE.L \1,(\1)                         ;MOVE An TO (An)
  72.  MOVE.L \1,LIST.HEAD(\1)                ;SHUFFLE HEAD AND TAIL POINTERS
  73.  ADD.L #LIST.TAIL,LIST.HEAD(\1)
  74.  CLR.L LIST.TAIL(\1)
  75.  MOVE.L \1,LIST.TAIL+NODE.PRED(\1)      ;SO THIS PORT IS FIRST IN LIST
  76.  ENDM
  77.  
  78. OPENDEVICE MACRO  ;*NAME,UNIT,*IOREQUEST,FLAGS
  79.  LEA \1,A0                      ;PUT NAME POINTER  INTO A0
  80.  MOVE.L #\2,D0                  ;PUT UNIT NUMBER   INTO D0
  81.  MOVE.L \3,A1                   ;PUT IOREQ POINTER INTO A1
  82.  MOVE.L #\4,D1                  ;PUT IOREQ FLAGS   INTO D1
  83.  SYSCALL OPENDEVICE             ;NOW MAKE THE CALL
  84.  ENDM
  85.  
  86. CLOSEDEVICE MACRO ;*IOREQUEST   ;SET UP TO CLOSE A DEVICE
  87.  MOVE.L \1,A1                   ;PUT IOREQ POINTER INTO A1
  88.  SYSCALL CLOSEDEVICE            ;NOW MAKE THE CALL
  89.  ENDM
  90.  
  91. ;*************** AND A FEW SIMPLE PROGRAMMING MACROS
  92.  
  93. SYSCALL MACRO                   ;CALL A EXEC LIBRARY ROUTINE
  94.  MOVE.L 4,A6
  95.  JSR LVO.\1(A6)
  96.  ENDM
  97.  
  98. CALL MACRO                      ;CALL A KERNEL ROUTINE
  99.  JSR LVO.\1(A6)
  100.  ENDM
  101.  
  102. PUSH MACRO                      ;PUSH A REGISTER ONTO STACK
  103.  MOVEM.L \1,-(SP)
  104.  ENDM
  105.  
  106. PULL MACRO                      ;PULL A REGISTER FROM STACK
  107.  MOVEM.L (SP)+,\1
  108.  ENDM
  109.  
  110. PUBLICMEM MACRO    ;SIZE        ;ALLOCATE SOME PUBLIC MEMORY
  111.  MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1
  112.  MOVE.L \1,D0
  113.  SYSCALL ALLOCMEM
  114.  ENDM
  115.  
  116. ;*************** GENERAL PURPOSE CREATE AND DELETE MSGPORT ROUTINES
  117.  
  118. MAKEAPORT        ;ENTER W/ PTR TO NAME IN A0, PRIORITY IN D0
  119.  PUSH D0/A0                        ;STASH THE REGS
  120.  MOVE #-1,D0                       ;DON'T CARE WHICH SIGBIT ALLOCATED FOR PORT
  121.  SYSCALL ALLOCSIGNAL               ;GET A SIGBIT
  122.  MOVE.B D0,D7                      ;STASH SIGBIT IN D7
  123.  CMPI.B #-1,D0                     ;IF ERROR -
  124.  BEQ ERR_PORT                      ; BRANCH OUT FROM HERE
  125.  PUBLICMEM #SIZE.MP                ;ELSE ALLOCATE MEM FOR A MESSAGE PORT
  126.  TST.L D0                          ;IF ERROR -
  127.  BEQ.S ERR_PORT                    ; BRANCH OUT FROM HERE
  128.  MOVE.L D0,A4                      ;ELSE PUT POINTER TO ALLOCATED MEM IN A4
  129.  MOVEQ #0,D0
  130.  MOVE.L D0,A1                      ;FOR THIS TASK -
  131.  CALL FINDTASK                     ;FIND THE TASK CONTROL BLOCK
  132.  MOVE.L D0,MP.SIGTASK(A4)          ;TELL PORT WHERE THE TCB IS
  133.  PULL D0/A0                        ;RESTORE THE REGS
  134.  MOVE.L A0,NODE.NAME(A4)           ;TELL LISTNODE OF PORT ITS NAME
  135.  MOVE.B D0,NODE.PRI(A4)            ;TELL LISTNODE OF PORT ITS PRIORITY
  136.  MOVE.B #NT_MSGPORT,NODE.TYPE(A4)  ;TELL LISTNODE OF PORT ITS TYPE
  137.  MOVE.B #PA_SIGNAL,MP.FLAGS(A4)    ;TELL PORT ITS FLAGS
  138.  MOVE.B D7,MP.SIGBIT(A4)           ;TELL PORT WHICH SIGBIT WAS ASSIGNED TO IT
  139.  CMPA.L #0,A0                      ;IF NO NAME
  140.  BEQ.S PRIVATEPORT                 ; THEN ITS A PRIVATE PORT
  141. PUBLICPORT                         ;ELSE IT HAS A NAME AND ITS PUBLIC
  142.  MOVE.L A4,A1                      ;PUT PTR TO MEM OF PORT INTO A1
  143.  CALL ADDPORT                      ;AND ADD THIS PORT TO EXISTING ONES
  144.  BRA NOPORTERR                     ;AND FINISH UP
  145. PRIVATEPORT
  146.  LEA MP.MSGLIST(A4),A0             ;SET UP PORT AS FIRST IN LIST
  147.  NEWLIST A0                        ;SEE MACRO ABOVE
  148. NOPORTERR
  149.  MOVE.L A4,D0                      ;PUT ADDRESS OF MSGPORT IN D0
  150.  RTS
  151. ERR_PORT                           ;IF ERROR, SET D0 = 0
  152.  MOVEQ #0,D0
  153.  RTS
  154.  
  155. KILLAPORT       ;ENTER W/ POINTER TO MSGPORT IN A0
  156.  PUSH A0                        ;STASH THE POINTER ON THE STACK
  157.  MOVEQ #0,D0
  158.  MOVE.B MP.SIGBIT(A0),D0        ;AND FREE UP THE SIGNAL BIT
  159.  CALL FREESIGNAL                ;PREVIOUSLY ALLOCATED FOR THIS PORT
  160.  PULL A1                        ;AND THE PORT'S MEMORY
  161.  MOVE.L #SIZE.MP,D0
  162.  SYSCALL FREEMEM
  163.  RTS
  164.  
  165. ;**************** PRINTER DEVICE SUPPORT CODE
  166.  
  167. OPENPRINTER
  168.  MOVEQ #0,D0               ;SET NAME AND PRIORITY OF MSGPORT = 0
  169.  MOVE.L D0,A0
  170.  BSR MAKEAPORT             ;AND CREATE REPLY MSGPORT FOR PRINTER I/O BLOCK
  171.  TST.L D0
  172.  BEQ ERR_OPENPRT
  173.  MOVE.L D0,PMPORT          ;ELSE THIS IS ADDR OF PRINTER MSGPORT
  174.  BSR CREATEPRTIO           ;USE MSGPORT TO HELP SET UP AN IOBLOCK
  175.  TST.L D0                  ;IF IOBLOCK BAD THEN
  176.  BEQ ERR_OPENPRT           ; BRANCH OUT FROM HERE
  177.  MOVE.L PRTBUF,IO.DATA(A0) ;ELSE ATTACH BUFFER TO IOBLOCK
  178.  MOVE.L #-1,IO.LENGTH(A0)  ;AND SET ARBITRARY LENGTH I/O
  179. OPENPRT
  180.  OPENDEVICE DEVNAME,0,IOREQ,0     ;NOW ATTACH PRINTER DEVICE TO IOBLOCK
  181.  TST.L D0                         ;IF NO PROBLEM THEN
  182.  BEQ.S END_OPENPRT                ; BRANCH TO END WITH D0 = 0
  183. ERR_OPENPRT
  184.  MOVE.L #1,D0                     ;ELSE FAIL WITH       D0 = 1
  185. END_OPENPRT
  186.  RTS
  187.  
  188. CREATEPRTIO
  189.  PUBLICMEM #SIZE.STDIO            ;GET SOME MEM FOR AN IOBLOCK
  190.  TST.L D0                         ;IF UNSUCCESSFUL THEN
  191.  BEQ ERR_PRTIO                    ; BRANCH OUT FROM HERE W/ D0 = 0
  192.  MOVE.L D0,IOREQ                  ;ELSE D0 = PTR TO IOBLOCK
  193.  MOVE.L D0,A0
  194.  MOVE.B #NT_MESSAGE,NODE.TYPE(A0) ;SET ITS LISTNODE TYPE = 'MESSAGE'
  195.  MOVE.B #0,NODE.PRI(A0)           ;SET ITS LISTNODE PRIORITY = 0
  196.  MOVE.L PMPORT,MSG.REPLYPORT(A0)  ;SET ITS REPLYPORT = MSGPORT
  197. ERR_PRTIO
  198.  RTS                              ;EXIT W/ D0 = ADDR OF IOBLOCK (0 IF ERROR)
  199.  
  200. CLOSEPRINTER
  201.  MOVE.L IOREQ,A1                ;GET ADDRESS OF IOBLOCK
  202.  CALL CHECKIO                   ;SEE IF I/O DONE
  203.  TST.L D0                       ;IF DONE THEN
  204.  BNE CLOSEPRT                   ; BRANCH OUT OF HERE
  205.  MOVE.L IOREQ,A1                ;ELSE GET ADDRESS OF IOBLOCK
  206.  CALL ABORTIO                   ;AND FORCE I/O TO END
  207.  MOVE.L PMPORT,A0               ;NOW WAIT FOR A MESSAGE AT THE REPLY PORT
  208.  CALL WAITPORT
  209.  MOVE.L PMPORT,A0
  210.  CALL GETMSG                    ;GET MESSAGE FROM PORT SAYING I/O ABORTED
  211. CLOSEPRT
  212.  CLOSEDEVICE IOREQ              ;NOW CLOSE DEVICE ATTACHED TO THE IOBLOCK
  213.  MOVE.L PMPORT,A0
  214.  BSR KILLAPORT                  ;AND FREE MSGPORT'S SIG BIT AND MEMORY
  215.  MOVE.L IOREQ,A1                ;AND THE IOBLOCK'S MEMORY, TOO!
  216.  MOVE.L #SIZE.STDIO,D0
  217.  SYSCALL FREEMEM
  218.  RTS
  219.  
  220. PRINTERWRITE             ;ENTER W/ PTR TO IOBLOCK IN A1
  221.                          ;      W/ PTR TO NULL-TERMINATED ASCII IN A0
  222.  
  223.  MOVE #CMD_WRITE,IO.COMMAND(A1) ;PUT 'WRITE' INTO IOBLOCK COMMAND FIELD
  224.  MOVE.L A0,IO.DATA(A1)          ;PTR TO NULL-TERMINATED DATA
  225.  MOVE.L #-1,IO.LENGTH(A1)       ;#BYTES TO WRITE (-1 MEANS UNTIL A NULL)
  226.  CALL DOIO                      ;AND CALL THE I/O ROUTINE (TRY SENDIO HERE)
  227.  RTS
  228.  
  229.  DATA
  230.  
  231. PMPORT DC.L 0                   ;PTR TO IOBLOCK REPLY MSGPORT
  232. IOREQ DC.L 0                    ;PTR TO PRINTER IOBLOCK
  233. PRTBUF DS.B 16                  ;ABSOLUTELY NECESSARY LITTLE BUFFER
  234.  
  235. DEVNAME
  236.  DC.B 'printer.device',0        ;NAME OF PRINTER DEVICE
  237.  EVEN
  238. IOTEXT
  239.  DC.B 10,'Hello from the heart of Amiga Exec',13,10,0
  240.  EVEN
  241.  END
  242.  
  243.